import throttle from '../../utils/throttle.js';
module.exports = {
	data() {
		return {}
	},
	onLoad() {
		this.getRect = this.$uGetRect
	},
	methods: {
		// 查询节点信息
		// 目前此方法在支付宝小程序中无法获取组件跟接点的尺寸，为支付宝的bug(2020-07-21)
		// 解决办法为在组件根部再套一个没有任何作用的view元素
		$uGetRect(selector, all) {
			return new Promise(resolve => {
				uni.createSelectorQuery().
				in(this)[all ? 'selectAll' : 'select'](selector)
					.boundingClientRect(rect => {
						if (all && Array.isArray(rect) && rect.length) {
							resolve(rect)
						}
						if (!all && rect) {
							resolve(rect)
						}
					})
					.exec()
			})
		},
		empty(value) {
			switch (typeof value) {
				case 'undefined':
					return true;
				case 'string':
					if (value.replace(/(^[ \t\n\r]*)|([ \t\n\r]*$)/g, '').length == 0) return true;
					break;
				case 'boolean':
					if (!value) return true;
					break;
				case 'number':
					if (value === 0 || isNaN(value)) return true;
					break;
				case 'object':
					if (value === null || value.length === 0) return true;
					for (const i in value) {
						return false;
					}
					return true;
			}
			return false;
		},
		addStyle(customStyle, target = 'object') {
			// 字符串转字符串，对象转对象情形，直接返回
			if (this.empty(customStyle) || (typeof customStyle === 'object' && target === 'object') || (target ===
					'string' && typeof customStyle === 'string')) {
				return customStyle;
			}
			// 字符串转对象
			if (target === 'object') {
				// 去除字符串样式中的两端空格(中间的空格不能去掉，比如padding: 20px 0如果去掉了就错了)，空格是无用的
				customStyle = trim(customStyle);
				// 根据";"将字符串转为数组形式
				const styleArray = customStyle.split(';');
				const style = {};
				// 历遍数组，拼接成对象
				for (let i = 0; i < styleArray.length; i++) {
					// 'font-size:20px;color:red;'，如此最后字符串有";"的话，会导致styleArray最后一个元素为空字符串，这里需要过滤
					if (styleArray[i]) {
						const item = styleArray[i].split(':');
						style[trim(item[0])] = trim(item[1]);
					}
				}
				return style;
			}
			// 这里为对象转字符串形式
			let string = '';
			for (const i in customStyle) {
				// 驼峰转为中划线的形式，否则css内联样式，无法识别驼峰样式属性名
				const key = i.replace(/([A-Z])/g, '-$1').toLowerCase();
				string += `${key}:${customStyle[i]};`;
			}
			// 去除两端空格
			return trim(string);
		},
		array(value) {
			if (typeof Array.isArray === 'function') {
				return Array.isArray(value);
			}
			return Object.prototype.toString.call(value) === '[object Array]';
		},
		deepClone(obj) {
			// 对常见的“非”值，直接返回原来值
			if ([null, undefined, NaN, false].includes(obj)) return obj;
			if (typeof obj !== 'object' && typeof obj !== 'function') {
				// 原始类型直接返回
				return obj;
			}
			const o = this.array(obj) ? [] : {};
			for (const i in obj) {
				if (obj.hasOwnProperty(i)) {
					o[i] = typeof obj[i] === 'object' ? this.deepClone(obj[i]) : obj[i];
				}
			}
			return o;
		},
		deepMerge(target = {}, source = {}) {
			target = this.deepClone(target);
			if (typeof target !== 'object' || typeof source !== 'object') return false;
			for (const prop in source) {
				if (!source.hasOwnProperty(prop)) continue;
				if (prop in target) {
					if (typeof target[prop] !== 'object') {
						target[prop] = source[prop];
					} else if (typeof source[prop] !== 'object') {
						target[prop] = source[prop];
					} else if (target[prop].concat && source[prop].concat) {
						target[prop] = target[prop].concat(source[prop]);
					} else {
						target[prop] = deepMerge(target[prop], source[prop]);
					}
				} else {
					target[prop] = source[prop];
				}
			}
			return target;
		},
		number(value) {
			return /^[\+-]?(\d+\.?\d*|\.\d+|\d\.\d+e\+\d+)$/.test(value);
		},
		addUnit(value = 'auto', unit = uni?.$u?.config?.unit ?? 'rpx') {
			value = String(value);
			// 用uView内置验证规则中的number判断是否为数值
			return this.number(value) ? `${value}${unit}` : value;
		},
		// 阻止事件冒泡
		preventEvent(e) {
			e && typeof e.stopPropagation === 'function' && e.stopPropagation();
		},
		sys() {
			return uni.getSystemInfoSync();
		},
		sleep(value = 30) {
			return new Promise((resolve) => {
				setTimeout(() => {
					resolve();
				}, value);
			});
		},
		// 空操作
		noop(e) {
			this.preventEvent(e);
		}
	}
}